前面做了两件事情,一个是控制器发送控制数据到服务器,一个是小车从服务器获取数据。
这里贴上服务器代码。
import socket
import time
from threading import Thread
# 小车的数据,由控制器上传状态,服务器进行处理,返回给小车
inputx=0
inputy=0
# 速度上限0-1023
MAX_SPEED = 1023.0
# 小车的延迟
time_car = 0
# 控制的延迟
time_input = 0
# 小车状态 0未连接 1已连接
car_state = 0
# 摇杆控制线程
def Control_Input(socket_input):
global inputx, inputy
while True:
try:
recvdata = socket_input.recv(8)
socket_input.send(b'1')
except:
print("控制器已断开")
socket_input.close()
break
if recvdata == None:
socket_input.close()
print("控制器断开1")
break
recvdata = recvdata.decode('utf-8')
if len(recvdata) != 8:
socket_input.close()
print("控制器断开2")
break
recvx = int(recvdata[0:4])
recvy = int(recvdata[4:8])
# 计算数据
# x 1877 y1807 中心50不计算
if recvx > 1877 - 50 and recvx < 1877 + 50:
recvx = 0
else:
if recvx < 1877:
recvx = int((1877 - recvx) * MAX_SPEED / 1877)
elif recvx > 1877:
recvx = int((recvx - 1877) * MAX_SPEED / (4095 - 1877)) + 5000
if recvy > 1807 - 50 and recvy < 1807 + 50:
recvy = 0
else:
if recvy < 1807:
recvy = int((1807 - recvy) * MAX_SPEED / 1807)
elif recvy > 1807:
recvy = int((recvy - 1807) * MAX_SPEED / (4095 - 1807)) + 5000
inputx = recvx
inputy = recvy
print(str(inputx) + '-' + str(inputy))
# 手机控制线程
def COntrol_Phone(socket_input):
global inputx,inputy
while True:
try:
recvdata = socket_input.recv(8)
except:
print("手机 控制器已断开")
socket_input.close()
break
if recvdata == None:
socket_input.close()
print("手机 控制器断开1")
break
recvdata = recvdata.decode('utf-8')
if len(recvdata) != 8:
socket_input.close()
print("手机 控制器断开2")
break
# 返回当前小车的状态
time_send = int(time_car*1000)
if time_send > 9999:
time_send = 9999
senddata = '{0:0>4}{1:0>4}'.format(time_send, car_state)
print(senddata)
try:
socket_input.send(bytes(senddata, encoding='utf-8'))
except:
print("手机 控制器已断开")
socket_input.close()
break
recvx = int(recvdata[0:4])
recvy = int(recvdata[4:8])
inputx = recvy
inputy = recvx
print(str(inputx) + '-' + str(inputy))
# 控制线程
def inputproc():
print("控制线程启动成功")
sock = socket.socket()
# 设置给定套接字选项的值。
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 把地址绑定到套接字
sock.bind(('0.0.0.0', 6668))
sock.listen()
while True:
print("等待控制器的连接...")
socket_input, addr = sock.accept()
print("新的控制器连接")
recvdata = socket_input.recv(1)
print(recvdata)
if recvdata == None:
socket_input.close()
print("控制器断开1")
break
if recvdata == b'1':
print("摇杆控制已连接")
proc= Thread(target=Control_Input, args=(socket_input,))
proc.start()
elif recvdata == b'2':
print("手机控制已连接")
proc = Thread(target=COntrol_Phone, args=(socket_input,))
proc.start()
else:
socket_input.close()
# 小车线程
def mxcarproc():
global car_state,time_car
print("小车线程启动成功")
sock = socket.socket()
# 设置给定套接字选项的值。
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 把地址绑定到套接字
sock.bind(('127.0.0.1', 6667))
sock.listen()
while True:
print("等待小车的连接...")
car_state = 0
socket_car, addr = sock.accept()
time_last = time.time()
car_state = 1
print("小车已连接")
while True:
try:
recvdata = socket_car.recv(1)
# 发送后到接收到数据之间的时间是延迟
if recvdata == None:
socket_car.close()
print("小车已断开")
break
time_car = time.time() - time_last
# recvdata = recvdata.decode('utf-8')
# print("recv " + recvdata)
# 接收到任何消息都返回当前数据
time_cur = time.time()
senddata = '{0:0>4}{1:0>4}'.format(inputx,inputy)
socket_car.send(bytes(senddata, encoding='utf-8'))
time_last = time.time()
except:
print("小车已断开")
socket_car.close()
break
if __name__ == '__main__':
proc1 = Thread(target=inputproc)
proc2 = Thread(target=mxcarproc)
proc1.start()
proc2.start()
这里简要说一下代码:
1.这个开启两个线程,一个是小车线程,一个是控制线程。
2.小车的端口是6667,控制器的端口是6668
3.我是跑在自己电脑上,然后通过frp进行转发的,如果你是跑在服务器上面,那么前面的ip和端口就填写服务器的ip和对应的端口。如果你是frp转发的,就填写转发后的端口。不会frp的可以百度,也可以参考http://mxblog.mxguanwang.cn/232.html。
4.细心的可能会发现,代码中还有一个线程是手机线程,那是怎么回事呢,摇杆感觉不方便,我又做了一个app。且看下篇。
Comments | NOTHING